interface User {
  account: string
  pwd: string
  age: number
}

// 一个带了索引器的类型别名
// type Obj = {
//   [p: string]: string
// }

// type Obj = {
//   [p in "account"|"pwd"|"age"]: string
// }

type Obj = {
  [p in keyof User]: string
}

// const u:Obj = {}
// // 只有属性名匹配 [p: string] 就可以加属性
// u.abs = '1234'

// // 这个属性太过于宽泛了,想更进不一步约束



// 给所有属性设置只读
type UserReadonly = {
  readonly [p in keyof User]: User[p]
}

const u: UserReadonly = {
  account: '账号',
  pwd: '123',
  age: 18
}

// 给所有属性设置可选
type UserPartial = {
  [p in keyof User  ]?: User[p]
}

// 通用
type MyPartial<T> = {
  [p in keyof T  ]?: T[p]
}

const u2: MyPartial<User> = {
  account:"ddd"
}

type MyReadonly<T> = {
  readonly [p in keyof T  ]: T[p]
}